package com.offer;

/**
 * 一个长度为n-1的递增排序数组中的所有数字都是唯一的，并且每个数字都在范围0～n-1之内。
 * 在范围0～n-1内的n个数字中有且只有一个数字不在该数组中，请找出这个数字。
 * 示例 1:
 * <p>
 * 输入: [0,1,3]
 * 输出: 2
 * 一个长度为n-1的递增排序数组中的所有数字都是唯一的，并且每个数字都在范围0～n-1之内。在范围0～n-1内的n个数字中有且只有一个数字不在该数组中，请找出这个数字。
 * <p>
 *  示例 2:
 * <p>
 * 输入: [0,1,2,3,4,5,6,7,9]
 * 输出: 8
 */
public class offer53_2 {
    public int missingNumber(int[] nums) {
        int l = 0, r = nums.length - 1;
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if (nums[mid] == mid) {//若 nums[m] = m，则 “右子数组的首位元素” 一定在闭区间 [m + 1, j] 中，因此执行 i = m + 1
                l = mid + 1;
            } else {//若 nums[m]!=m，则 “左子数组的末位元素” 一定在闭区间 [i, m - 1]中，因此执行 j = m - 1;
                r = mid - 1;
            }
        }
        return l;// 跳出时，变量 ii和 jj分别指向 “右子数组的首位元素” 和 “左子数组的末位元素” 。因此返回 i 即可。
    }
}
